package cn.itcast.ssm.controller;

import java.io.File;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import cn.itcast.ssm.controller.validation.ValidGroup1;
import cn.itcast.ssm.po.ItemsCustom;
import cn.itcast.ssm.po.ItemsQueryVo;
import cn.itcast.ssm.service.ItemsService;

/**
 * 
 * <p>
 * Title: ItemsController
 * </p>
 * <p>
 * Description:商品的controller
 * </p>
 * <p>
 * Company: www.itcast.com
 * </p>
 * 
 * @author 传智.燕青
 * @date 2015-4-13下午4:03:35
 * @version 1.0
 */
@Controller
//为了对url进行分类管理 ，可以在这里定义根路径，最终访问url是根路径+子路径
//比如：商品列表：/items/queryItems.action 
//窄 化请求方法
@RequestMapping("/items")
public class ItemsController {
	
    /**
     * LOG.
     */
    private static final Logger LOG = LoggerFactory.getLogger(ItemsController.class);
    
    //遵循name绑定。。。。。。
		//商品查询列表
       /**注入itemsService*/
		@Autowired
		private ItemsService itemsService;
		//@RequestMapping实现 对queryItems方法和url进行映射，一个方法对应一个url
		//一般建议将url和方法写成一样
		@RequestMapping(value="/queryItems")
		public ModelAndView queryItems(HttpServletRequest request,ItemsQueryVo itemsQueryVo)throws Exception{
			//测试forward后request是否可以共享
			
			System.out.println(request.getParameter("id"));
			//调用service查找 数据库，查询商品列表，这里使用静态数据模拟
			List<ItemsCustom> itemsList = itemsService.findItemsList(itemsQueryVo);
			
			//返回ModelAndView
			ModelAndView modelAndView =  new ModelAndView();
			//相当 于request的setAttribut，在jsp页面中通过itemsList取数据
			modelAndView.addObject("itemsList", itemsList);
			
			//指定视图
			//下边的路径，如果在视图解析器中配置jsp路径的前缀和jsp路径的后缀，修改为
			//modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
			//上边的路径配置可以不在程序中指定jsp路径的前缀和jsp路径的后缀
			modelAndView.setViewName("items/itemsList");
			//modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
			return modelAndView;
			
		}
		
		//定义其它的方法
		//商品添加
		/**
		//商品信息修改页面显示
		//@RequestMapping("/editItems")
		//限制http请求方法，可以post和get
		@RequestMapping(value="/editItems",method={RequestMethod.POST,RequestMethod.GET})
		public ModelAndView editItems() throws Exception{
			
			//调用service根据商品id查询商品信息
			ItemsCustom itemsCustom = ItemsService.findItemsById(1);
			//返回ModelAndView
			ModelAndView modelAndView =  new ModelAndView();
			//将商品信息放在ModelAndView
			modelAndView.addObject("itemsCustom",itemsCustom);
			//指定视图
			modelAndView.setViewName("items/editItems");
			
			return modelAndView;
		}
		*/
		//商品信息修改页面显示
		//@RequestMapping("/editItems")
		//限制http请求方法，可以post和get
		/**本方法将处理   /items/editItems?id=1*/
		@RequestMapping(value="/editItems",method={RequestMethod.POST,RequestMethod.GET})
			//@RequestParam里边指定request传入参数名称和形参进行绑定。
			//通过required属性指定参数是否必须要传入
			//通过defaultValue可以设置默认值，如果id参数没有传入，将默认值和形参绑定。
		public String editItems(Map<String, Object> model,@RequestParam(value="id",required=true,defaultValue="1") Integer id) throws Exception{
			/**本方法将处理   /items/editItems/id*/
//		@RequestMapping(value="/editItems/{id}",method={RequestMethod.POST,RequestMethod.GET})
//		public String editItems(Map<String, Object> model,@PathVariable(value="id") Integer id) throws Exception{
		    LOG.debug("In editItems , id = {} ", id );
			//调用service根据商品id查询商品信息
			ItemsCustom itemsCustom = itemsService.findItemsById(id);
			//返回ModelAndView
			//ModelAndView modelAndView =  new ModelAndView();
			//将商品信息放在ModelAndView
			//modelAndView.addObject("itemsCustom",itemsCustom);
			
			//判断商品是否为空，如果根据id没有查到商品，抛出异常  提示用户商品信息不存在
//			 if (itemsCustom == null) {
//				throw  new CustomException("修改的商品信息不存在");
//			}
			//通过形参中的model将model数据传到页面
			model.put("itemsCustom",itemsCustom);	//model 的一种形式Map<String, Object>  实现restful理念
			
			return "items/editItems";
		}
		//商品信息修改提交MAP
		@RequestMapping(value="/editItemsSubmit")
		public String editItemsSubmit(HttpServletRequest request,Integer id,Model model,
				@ModelAttribute("items") @Validated(value = { ValidGroup1.class }) ItemsCustom itemsCustom,
				BindingResult bindingResult,
				MultipartFile items_pic  //接受商品图片
				) throws Exception{
			// 获取校验错误信息
			if (bindingResult.hasErrors()) {
				// 输出错误信息
				List<ObjectError> allErrors = bindingResult.getAllErrors();

				for (ObjectError objectError : allErrors) {
					// 输出错误信息
					System.out.println(objectError.getDefaultMessage());

				}
				// 将错误信息传到页面
				model.addAttribute("allErrors", allErrors);
				
				
				//可以直接使用model将提交pojo回显到页面
				model.addAttribute("items", itemsCustom);
				
				
				// 出错重新到商品修改页面
				return "items/editItems";
			}
			//上传图片
			//上传图片的原始名称
			String originalFilename = items_pic.getOriginalFilename();
			if (items_pic != null &&originalFilename !=null && originalFilename.length() >0) {
				//储存图片的物理路径
				String pic_path = "F:\\develop\\upload\\temp\\";
				//上传图片的原始名称
			
				//新的图片名称
				//System.currentTimeMillis()  时间戳  UUID.randomUUID() 
				String newFileName = System.currentTimeMillis()  + originalFilename.substring(originalFilename.lastIndexOf("."));
				//新图片
				File newFile = new File(pic_path + newFileName);
				//将内存中的数据写入磁盘
				items_pic.transferTo(newFile);
				//将新图片的名称写入到itemsCustom中
				itemsCustom.setPic(newFileName);
				
			}
			
			//调用service更新商品信息，页面需要将商品信息传到此方法
			itemsService.updateItems(id, itemsCustom);
			//重定向
			
			//重定向到商品查询列表
			//return "redirect:queryItems.action";
			//页面转发
			return "forward:queryItems.action";
//			return "success";
		}

		// 批量删除 商品信息
		@RequestMapping("/deleteItems")
		public String deleteItems(Integer[] items_id) throws Exception {

			// 调用service批量删除商品
			// ...

			return "success";

		}

		// 批量修改商品页面，将商品信息查询出来，在页面中可以编辑商品信息
		@RequestMapping("/editItemsQuery")
		public ModelAndView editItemsQuery(HttpServletRequest request,
				ItemsQueryVo itemsQueryVo) throws Exception {

			// 调用service查找 数据库，查询商品列表
			List<ItemsCustom> itemsList = itemsService.findItemsList(itemsQueryVo);

			// 返回ModelAndView
			ModelAndView modelAndView = new ModelAndView();
			// 相当 于request的setAttribut，在jsp页面中通过itemsList取数据
			modelAndView.addObject("itemsList", itemsList);

			modelAndView.setViewName("items/editItemsQuery");

			return modelAndView;

		}
		// 批量修改商品提交
		// 通过ItemsQueryVo接收批量提交的商品信息，将商品信息存储到itemsQueryVo中itemsList属性中。
		@RequestMapping("/editItemsAllSubmit")
		public String editItemsAllSubmit(ItemsQueryVo itemsQueryVo)
				throws Exception {

			return "success";
		}
}
